

<!DOCTYPE html>
<html class="writer-html5" lang="en" >
<head>
  <meta charset="utf-8" />
  <meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />

  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  
  <title>监控 OSD 和归置组 &mdash; Ceph Documentation</title>
  

  
  <link rel="stylesheet" href="../../../_static/ceph.css" type="text/css" />
  <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
  <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
  <link rel="stylesheet" href="../../../_static/ceph.css" type="text/css" />
  <link rel="stylesheet" href="../../../_static/graphviz.css" type="text/css" />
  <link rel="stylesheet" href="../../../_static/css/custom.css" type="text/css" />

  
  

  
  

  

  
  <!--[if lt IE 9]>
    <script src="../../../_static/js/html5shiv.min.js"></script>
  <![endif]-->
  
    
      <script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
        <script src="../../../_static/jquery.js"></script>
        <script src="../../../_static/_sphinx_javascript_frameworks_compat.js"></script>
        <script data-url_root="../../../" id="documentation_options" src="../../../_static/documentation_options.js"></script>
        <script src="../../../_static/doctools.js"></script>
        <script src="../../../_static/sphinx_highlight.js"></script>
    
    <script type="text/javascript" src="../../../_static/js/theme.js"></script>

    
    <link rel="index" title="Index" href="../../../genindex/" />
    <link rel="search" title="Search" href="../../../search/" />
    <link rel="next" title="用户管理" href="../user-management/" />
    <link rel="prev" title="监控集群" href="../monitoring/" /> 
</head>

<body class="wy-body-for-nav">

   
  <header class="top-bar">
    <div role="navigation" aria-label="Page navigation">
  <ul class="wy-breadcrumbs">
      <li><a href="../../../" class="icon icon-home" aria-label="Home"></a></li>
          <li class="breadcrumb-item"><a href="../../">Ceph 存储集群</a></li>
          <li class="breadcrumb-item"><a href="../">集群运维</a></li>
      <li class="breadcrumb-item active">监控 OSD 和归置组</li>
      <li class="wy-breadcrumbs-aside">
            <a href="../../../_sources/rados/operations/monitoring-osd-pg.rst.txt" rel="nofollow"> View page source</a>
      </li>
  </ul>
  <hr/>
</div>
  </header>
  <div class="wy-grid-for-nav">
    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-scroll">
        <div class="wy-side-nav-search"  style="background: #eee" >
          

          
            <a href="../../../" class="icon icon-home"> Ceph
          

          
          </a>

          

          
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="../../../search/" method="get">
    <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>

          
        </div>

        
        <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
          
            
            
              
            
            
              <ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../../start/">Ceph 简介</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../install/">安装 Ceph</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../cephadm/">Cephadm</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../../">Ceph 存储集群</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../../configuration/">配置</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="../">运维</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="../operating/">操纵集群</a></li>
<li class="toctree-l3"><a class="reference internal" href="../health-checks/">健康检查</a></li>
<li class="toctree-l3"><a class="reference internal" href="../monitoring/">监控集群</a></li>
<li class="toctree-l3 current"><a class="current reference internal" href="#">监控 OSD 和归置组</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#id1">监控 OSD</a></li>
<li class="toctree-l4"><a class="reference internal" href="#id2">归置组集</a></li>
<li class="toctree-l4"><a class="reference internal" href="#id3">节点互联</a></li>
<li class="toctree-l4"><a class="reference internal" href="#id4">监控归置组状态</a></li>
<li class="toctree-l4"><a class="reference internal" href="#id14">找出故障归置组</a></li>
<li class="toctree-l4"><a class="reference internal" href="#id15">定位对象</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../user-management/">用户管理</a></li>
<li class="toctree-l3"><a class="reference internal" href="../pgcalc/">PG Calc</a></li>
<li class="toctree-l3"><a class="reference internal" href="../data-placement/">数据归置概览</a></li>
<li class="toctree-l3"><a class="reference internal" href="../pools/">存储池</a></li>
<li class="toctree-l3"><a class="reference internal" href="../erasure-code/">纠删码</a></li>
<li class="toctree-l3"><a class="reference internal" href="../cache-tiering/">分级缓存</a></li>
<li class="toctree-l3"><a class="reference internal" href="../placement-groups/">归置组</a></li>
<li class="toctree-l3"><a class="reference internal" href="../upmap/">使用 pg-upmap</a></li>
<li class="toctree-l3"><a class="reference internal" href="../read-balancer/">Operating the Read (Primary) Balancer</a></li>
<li class="toctree-l3"><a class="reference internal" href="../balancer/">均衡器模块</a></li>
<li class="toctree-l3"><a class="reference internal" href="../crush-map/">CRUSH 图</a></li>
<li class="toctree-l3"><a class="reference internal" href="../crush-map-edits/">手动编辑一个 CRUSH 图</a></li>
<li class="toctree-l3"><a class="reference internal" href="../stretch-mode/">Stretch Clusters</a></li>
<li class="toctree-l3"><a class="reference internal" href="../change-mon-elections/">Configuring Monitor Election Strategies</a></li>
<li class="toctree-l3"><a class="reference internal" href="../add-or-rm-osds/">增加/删除 OSD</a></li>
<li class="toctree-l3"><a class="reference internal" href="../add-or-rm-mons/">增加/删除监视器</a></li>
<li class="toctree-l3"><a class="reference internal" href="../devices/">设备管理</a></li>
<li class="toctree-l3"><a class="reference internal" href="../bluestore-migration/">迁移到 BlueStore</a></li>
<li class="toctree-l3"><a class="reference internal" href="../control/">命令参考</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../troubleshooting/community/">Ceph 社区</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../troubleshooting/troubleshooting-mon/">监视器故障排除</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../troubleshooting/troubleshooting-osd/">OSD 故障排除</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../troubleshooting/troubleshooting-pg/">归置组排障</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../troubleshooting/log-and-debug/">日志记录和调试</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../troubleshooting/cpu-profiling/">CPU 剖析</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../troubleshooting/memory-profiling/">内存剖析</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../../man/">    手册页</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../troubleshooting/">故障排除</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/">APIs</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../../cephfs/">Ceph 文件系统</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../rbd/">Ceph 块设备</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../radosgw/">Ceph 对象网关</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../mgr/">Ceph 管理器守护进程</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../mgr/dashboard/">Ceph 仪表盘</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../monitoring/">监控概览</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../api/">API 文档</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../architecture/">体系结构</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../dev/developer_guide/">开发者指南</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../dev/internals/">Ceph 内幕</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../governance/">项目管理</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../foundation/">Ceph 基金会</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../ceph-volume/">ceph-volume</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../releases/general/">Ceph 版本（总目录）</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../releases/">Ceph 版本（索引）</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../security/">Security</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../hardware-monitoring/">硬件监控</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../glossary/">Ceph 术语</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../jaegertracing/">Tracing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../translation_cn/">中文版翻译资源</a></li>
</ul>

            
          
        </div>
        
      </div>
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" aria-label="top navigation">
        
          <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
          <a href="../../../">Ceph</a>
        
      </nav>


      <div class="wy-nav-content">
        
        <div class="rst-content">
        
          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
           <div itemprop="articleBody">
            
<div id="dev-warning" class="admonition note">
  <p class="first admonition-title">Notice</p>
  <p class="last">This document is for a development version of Ceph.</p>
</div>
  <div id="docubetter" align="right" style="padding: 5px; font-weight: bold;">
    <a href="https://pad.ceph.com/p/Report_Documentation_Bugs">Report a Documentation Bug</a>
  </div>

  
  <section id="osd">
<h1>监控 OSD 和归置组<a class="headerlink" href="#osd" title="Permalink to this heading"></a></h1>
<p>高可用性和高可靠性要求容错方法来管理软硬件。
Ceph 没有单故障点，并且能在“降级”模式下继续提供服务。
其<a class="reference external" href="../data-placement">数据归置</a>引进了一个间接层，
它可保证数据不会直接绑死到某一个特定 OSD 地址，
这也意味着追踪系统错误的根源得深入<a class="reference external" href="../placement-groups">归置组</a>及底层的 OSD 。</p>
<div class="admonition tip">
<p class="admonition-title">Tip</p>
<p>集群某一部分失效可能导致不能访问某个对象，
但不会牵连其他对象。
碰到这种问题时无需恐慌，只需按步骤检查
OSD 和归置组，然后排除故障。</p>
</div>
<p>Ceph 通常能自己康复，然而如果故障持续存在，监控
OSD 和归置组有助于找出问题所在。</p>
<section id="id1">
<h2>监控 OSD<a class="headerlink" href="#id1" title="Permalink to this heading"></a></h2>
<p>某个 OSD 可能是在提供服务（ <code class="docutils literal notranslate"><span class="pre">in</span></code> ）或不能提供服务（ <code class="docutils literal notranslate"><span class="pre">out</span></code> ）；
可以是在运行且可达（ <code class="docutils literal notranslate"><span class="pre">up</span></code> ）或不在运行且不可达（ <code class="docutils literal notranslate"><span class="pre">down</span></code> ）。</p>
<p>如果一个 OSD 状态为 <code class="docutils literal notranslate"><span class="pre">up</span></code> ，它可能正在提供服务（ <code class="docutils literal notranslate"><span class="pre">in</span></code> ，客户端可以读写数据）
或者可能没在提供服务（ <code class="docutils literal notranslate"><span class="pre">out</span></code> ）。如果一个 OSD 它以前是 <code class="docutils literal notranslate"><span class="pre">in</span></code>
但随后由于故障或手动操作、设置成了 <code class="docutils literal notranslate"><span class="pre">out</span></code> 状态，
Ceph 会把其归置组迁移到其他 OSD ，以维持预先配置的冗余性。</p>
<p>如果一个 OSD 没在提供服务（ <code class="docutils literal notranslate"><span class="pre">out</span></code> ）， CRUSH 就不会再分配归置组给它。
如果它挂了（ <code class="docutils literal notranslate"><span class="pre">down</span></code> ），其状态也应该是 <code class="docutils literal notranslate"><span class="pre">out</span></code> 。</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>如果一 OSD 状态为 <code class="docutils literal notranslate"><span class="pre">down</span></code> 且 <code class="docutils literal notranslate"><span class="pre">in</span></code> ，必定有问题，而且集群处于非健康状态。</p>
</div>
<p class="ditaa">
<img src="../../../_images/ditaa-89282b7911f292f13594f3d24ef4f807abe7446b.png"/>
</p>
<p>如果你执行过这些命令，如 <code class="docutils literal notranslate"><span class="pre">ceph</span> <span class="pre">health</span></code> 、 <code class="docutils literal notranslate"><span class="pre">ceph</span> <span class="pre">-s</span></code> 、或 <code class="docutils literal notranslate"><span class="pre">ceph</span> <span class="pre">-w</span></code> ，
也许注意到了，集群并非一直返回 <code class="docutils literal notranslate"><span class="pre">HEALTH</span> <span class="pre">OK</span></code> ，
别紧张。就 OSD 而言你应该明确，在一些情况下集群<strong>不会</strong>返回 <code class="docutils literal notranslate"><span class="pre">HEALTH</span> <span class="pre">OK</span></code> ：</p>
<ol class="arabic simple">
<li><p>你还没启动集群（它不会响应的）。</p></li>
<li><p>你刚刚启动或重启完集群，而且它还没准备好，
因为归置组正被创建、
OSD 们正在相互建立连接。</p></li>
<li><p>你刚刚增加或拆除一个 OSD 。</p></li>
<li><p>你刚刚修改完集群运行图。</p></li>
</ol>
<p>OSD 监控的一个重要事情是，当集群启动并运行时，
所有 OSD 也应该是启动（ <code class="docutils literal notranslate"><span class="pre">up</span></code> ）并在集群内（ <code class="docutils literal notranslate"><span class="pre">in</span></code> ）运行。
用下列命令查看：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><style type="text/css">
span.prompt1:before {
  content: "$ ";
}
</style><span class="prompt1">ceph<span class="w"> </span>osd<span class="w"> </span>stat</span>
</pre></div></div><p>其结果会告诉你 OSD 总数（ x ）、多少个是 <code class="docutils literal notranslate"><span class="pre">up</span></code> 的（ y ）、多少个是 <code class="docutils literal notranslate"><span class="pre">in</span></code> 的（ z ）、还有运行图的 epoch (eNNNN) 。</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">x</span> <span class="n">osds</span><span class="p">:</span> <span class="n">y</span> <span class="n">up</span><span class="p">,</span> <span class="n">z</span> <span class="ow">in</span><span class="p">;</span> <span class="n">epoch</span><span class="p">:</span> <span class="n">eNNNN</span>
</pre></div>
</div>
<p>如果处于 <code class="docutils literal notranslate"><span class="pre">in</span></code> 状态的 OSD 多于 <code class="docutils literal notranslate"><span class="pre">up</span></code> 的，
用下列命令看看哪些 <code class="docutils literal notranslate"><span class="pre">ceph-osd</span></code> 守护进程没在运行：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span class="prompt1">ceph<span class="w"> </span>osd<span class="w"> </span>tree</span>
</pre></div></div><div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="c1">#ID CLASS WEIGHT  TYPE NAME             STATUS REWEIGHT PRI-AFF</span>
 <span class="o">-</span><span class="mi">1</span>       <span class="mf">2.00000</span> <span class="n">pool</span> <span class="n">openstack</span>
 <span class="o">-</span><span class="mi">3</span>       <span class="mf">2.00000</span> <span class="n">rack</span> <span class="n">dell</span><span class="o">-</span><span class="mi">2950</span><span class="o">-</span><span class="n">rack</span><span class="o">-</span><span class="n">A</span>
 <span class="o">-</span><span class="mi">2</span>       <span class="mf">2.00000</span> <span class="n">host</span> <span class="n">dell</span><span class="o">-</span><span class="mi">2950</span><span class="o">-</span><span class="n">A1</span>
  <span class="mi">0</span>   <span class="n">ssd</span> <span class="mf">1.00000</span>      <span class="n">osd</span><span class="mf">.0</span>                <span class="n">up</span>  <span class="mf">1.00000</span> <span class="mf">1.00000</span>
  <span class="mi">1</span>   <span class="n">ssd</span> <span class="mf">1.00000</span>      <span class="n">osd</span><span class="mf">.1</span>              <span class="n">down</span>  <span class="mf">1.00000</span> <span class="mf">1.00000</span>
</pre></div>
</div>
<div class="admonition tip">
<p class="admonition-title">Tip</p>
<p>精心设计的 CRUSH 分级结构可以帮你更快的定位到物理位置、加快故障排除。</p>
</div>
<p>若一个 OSD 状态为 <code class="docutils literal notranslate"><span class="pre">down</span></code> ，启动它：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span class="prompt1">sudo<span class="w"> </span>systemctl<span class="w"> </span>start<span class="w"> </span>ceph-osd@1</span>
</pre></div></div><p>和 OSD 没运行或不启动相关的问题请看 <a class="reference external" href="../../troubleshooting/troubleshooting-osd#osd-not-running">OSD 没运行</a>。</p>
</section>
<section id="id2">
<h2>归置组集<a class="headerlink" href="#id2" title="Permalink to this heading"></a></h2>
<p>CRUSH 要把归置组分配到 OSD 时，它先查询这个存储池的副本数设置，再把归置组分配到 OSD ，这样就把归置组的各副本分配到了不同 OSD 。比如，如果存储池要求归置组有 3 个副本， CRUSH 可能把它们分别分配到
<code class="docutils literal notranslate"><span class="pre">osd.1</span></code> 、 <code class="docutils literal notranslate"><span class="pre">osd.2</span></code> 、 <code class="docutils literal notranslate"><span class="pre">osd.3</span></code> 。考虑到你设置于 <a class="reference external" href="../crush-map">CRUSH 运行图</a>中的失败域，实际上 CRUSH 找出的是伪随机位置，所以在大型集群中，你很少能看到归置组被分配到了相邻的 OSD 。</p>
<p>Ceph 靠 <strong>Acting Set</strong> 处理客户端请求，
它们是最终处理请求的一系列 OSD ，
因为它们有一个完整的、可以正常工作的归置组分片版本。
相比之下， <strong>Up Set</strong> 是一系列的 OSD 们，它们内含一个特定归置组，
数据将被移动到、复制到 <strong>Up Set</strong> ，或是计划移动到、复制到 <strong>Up Set</strong> 。
参见 <a class="reference internal" href="../pg-concepts/#rados-operations-pg-concepts"><span class="std std-ref">归置组概念</span></a> 。</p>
<p>在某些情形下，位于 acting set 中的一个 OSD <code class="docutils literal notranslate"><span class="pre">down</span></code> 了或者不能为归置组内的对象提供服务，这些情形发生时无需惊慌，常见原因如下：</p>
<ul class="simple">
<li><p>你增加或拆除了一个 OSD ，然后 CRUSH 把那个归置组分配到了其他 OSD ，并且这个重分配改变了 Acting Set 的构成、并触发了 backfill （回填）进程做数据迁移；</p></li>
<li><p>一 OSD <code class="docutils literal notranslate"><span class="pre">down</span></code> 了、重启了、而现在正恢复（ <code class="docutils literal notranslate"><span class="pre">recovering</span></code> ）；</p></li>
<li><p>acting set 中的一个 OSD 挂了，不能提供服务，另一个 OSD 临时接替其工作。</p></li>
</ul>
<p>大多数情况下 Up Set 和 Acting Set 是相同的，如果不同，说明可能 Ceph 正在迁移这个 PG （换句话说就是，这个 PG 被重映射了）、
原因可能是某个 OSD 正在恢复、或者集群哪里有问题。
这种情况下， Ceph 通常显示 “HEALTH WARN” 状态，还有 “stuck stale” 消息。</p>
<p>用下列命令获取归置组列表：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span class="prompt1">ceph<span class="w"> </span>pg<span class="w"> </span>dump</span>
</pre></div></div><p>要查看指定归置组的 Acting Set 和 Up Set 里有哪些 OSD ，执行下列命令：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span class="prompt1">ceph<span class="w"> </span>pg<span class="w"> </span>map<span class="w"> </span><span class="o">{</span>pg-num<span class="o">}</span></span>
</pre></div></div><p>其结果会告诉你 osdmap 版本（ eNNN ）、归置组号（ {pg-num} ）、 Up Set 内的 OSD （ up[] ）、和 Acting Set 内的 OSD
（ acting[] ）。</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">osdmap</span> <span class="n">eNNN</span> <span class="n">pg</span> <span class="p">{</span><span class="n">raw</span><span class="o">-</span><span class="n">pg</span><span class="o">-</span><span class="n">num</span><span class="p">}</span> <span class="p">({</span><span class="n">pg</span><span class="o">-</span><span class="n">num</span><span class="p">})</span> <span class="o">-&gt;</span> <span class="n">up</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">]</span> <span class="n">acting</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">]</span>
</pre></div>
</div>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>如果 Up Set 和 Acting Set 不一致，这可能表明集群内部在重均衡或者有潜在问题。</p>
</div>
</section>
<section id="id3">
<h2>节点互联<a class="headerlink" href="#id3" title="Permalink to this heading"></a></h2>
<p>写入数据前，归置组必须处于 <code class="docutils literal notranslate"><span class="pre">active</span></code> 、
而且<strong>应该</strong>是 <code class="docutils literal notranslate"><span class="pre">clean</span></code> 状态。
假设一存储池的归置组有 3 个副本，为了让 Ceph 确定归置组的当前状态，
一归置组的主 OSD （即 acting set 内的第一个 OSD ）
会与第二和第三 OSD 建立连接、
并就归置组的当前状态达成一致意见。</p>
<p class="ditaa">
<img src="../../../_images/ditaa-8bea3f437d2580001880177671ee4f7d5c8a2ec6.png"/>
</p>
<p>OSD 们也向监视器报告自己的状态，
详情见<a class="reference external" href="../../configuration/mon-osd-interaction/">监视器与 OSD 交互的配置</a>。
要排除连接建立问题，参见<a class="reference external" href="../../troubleshooting/troubleshooting-pg#failures-osd-peering">互联失败</a>。</p>
</section>
<section id="id4">
<h2>监控归置组状态<a class="headerlink" href="#id4" title="Permalink to this heading"></a></h2>
<p>如果你执行过 <code class="docutils literal notranslate"><span class="pre">ceph</span> <span class="pre">health</span></code> 、 <code class="docutils literal notranslate"><span class="pre">ceph</span> <span class="pre">-s</span></code> 、或 <code class="docutils literal notranslate"><span class="pre">ceph</span> <span class="pre">-w</span></code> 命令，
你也许注意到了集群并非总返回 <code class="docutils literal notranslate"><span class="pre">HEALTH</span> <span class="pre">OK</span></code> 。
检查完 OSD 是否在运行后，你还应该检查归置组状态。
你应该明白，在归置组建立连接时集群<strong>不会</strong>返回 <code class="docutils literal notranslate"><span class="pre">HEALTH</span> <span class="pre">OK</span></code> ：</p>
<ol class="arabic simple">
<li><p>刚刚创建了一个存储池，归置组还没互联好；</p></li>
<li><p>归置组正在恢复；</p></li>
<li><p>刚刚增加或删除了一个 OSD ；</p></li>
<li><p>刚刚修改了 CRUSH 图，并且归置组正在迁移；</p></li>
<li><p>某一归置组的副本间的数据不一致；</p></li>
<li><p>Ceph 正在洗刷一个归置组的副本；</p></li>
<li><p>Ceph 没有足够空余容量来完成回填操作。</p></li>
</ol>
<p>如果是前述原因之一导致了 Ceph 返回 <code class="docutils literal notranslate"><span class="pre">HEALTH</span> <span class="pre">WARN</span></code> ，无需紧张。
很多情况下，集群会自行恢复；有些时候你得采取些措施。
归置组监控的一件重要事情是保证集群起来并运行着，
所有归置组都处于 <code class="docutils literal notranslate"><span class="pre">active</span></code> 状态、
并且最好是 <code class="docutils literal notranslate"><span class="pre">clean</span></code> 状态。
用下列命令查看所有归置组状态：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span class="prompt1">ceph<span class="w"> </span>pg<span class="w"> </span>stat</span>
</pre></div></div><p>其结果会告诉你归置组总数（ x ）、
有多少归置组处于某种特定状态，
如 <code class="docutils literal notranslate"><span class="pre">active+clean</span></code> （ y ）、还有存储的数据量（ z ）。</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">x</span> <span class="n">pgs</span><span class="p">:</span> <span class="n">y</span> <span class="n">active</span><span class="o">+</span><span class="n">clean</span><span class="p">;</span> <span class="n">z</span> <span class="nb">bytes</span> <span class="n">data</span><span class="p">,</span> <span class="n">aa</span> <span class="n">MB</span> <span class="n">used</span><span class="p">,</span> <span class="n">bb</span> <span class="n">GB</span> <span class="o">/</span> <span class="n">cc</span> <span class="n">GB</span> <span class="n">avail</span>
</pre></div>
</div>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>对 Ceph 来说，同时报告出归置组的多种状态是正常的。例如
<code class="docutils literal notranslate"><span class="pre">active+clean</span></code> 、 <code class="docutils literal notranslate"><span class="pre">active+clean+remapped</span></code> 、 <code class="docutils literal notranslate"><span class="pre">active+clean+scrubbing</span></code> 。</p>
</div>
<p>除了归置组状态之外， Ceph 也会报告已用的存储容量（ aa ）、
剩余空间（ bb ）和归置组总容量。这些数字在某些情况下是很重要的：</p>
<ul class="simple">
<li><p>快达到 <code class="docutils literal notranslate"><span class="pre">near</span> <span class="pre">full</span> <span class="pre">ratio</span></code> 或 <code class="docutils literal notranslate"><span class="pre">full</span> <span class="pre">ratio</span></code> 时；</p></li>
<li><p>由于 CRUSH 配置错误致使你的数据没能在集群内分布。</p></li>
</ul>
<aside class="topic">
<p class="topic-title">归置组唯一标识符（ PG ID ）</p>
<p>归置组 ID 由存储池号（不是存储池名字）、后面跟一个点（ . ）、
然后是归置组 ID ，它是一个十六进制数字。
用 <code class="docutils literal notranslate"><span class="pre">ceph</span> <span class="pre">osd</span> <span class="pre">lspools</span></code> 可查看存储池号及其名字，
例如，第一个创建的存储池对应于存储池号 1 。
完整的归置组 ID 格式如下：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">{</span><span class="n">pool</span><span class="o">-</span><span class="n">num</span><span class="p">}</span><span class="o">.</span><span class="p">{</span><span class="n">pg</span><span class="o">-</span><span class="nb">id</span><span class="p">}</span>
</pre></div>
</div>
<p>典型长相：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mf">1.1</span><span class="n">f</span>
</pre></div>
</div>
</aside>
<p>用下列命令获取归置组列表：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span class="prompt1">ceph<span class="w"> </span>pg<span class="w"> </span>dump</span>
</pre></div></div><p>你也可以让它输出到 JSON 格式，并保存到文件：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span class="prompt1">ceph<span class="w"> </span>pg<span class="w"> </span>dump<span class="w"> </span>-o<span class="w"> </span><span class="o">{</span>filename<span class="o">}</span><span class="w"> </span>--format<span class="o">=</span>json</span>
</pre></div></div><p>要查询某个归置组，用下列命令：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span class="prompt1">ceph<span class="w"> </span>pg<span class="w"> </span><span class="o">{</span>poolnum<span class="o">}</span>.<span class="o">{</span>pg-id<span class="o">}</span><span class="w"> </span>query</span>
</pre></div></div><p>Ceph 会输出成 JSON 格式。</p>
<p>后续子章节详述了常见的 pg 状态。</p>
<section id="id5">
<h3>存储池在建中<a class="headerlink" href="#id5" title="Permalink to this heading"></a></h3>
<p>PG 是创建存储池时创建的：创建存储池的命令会指定这个存储池的 PG 总数，
并且会在创建存储池后，也一并创建所有 PG 。
Ceph 在创建归置组时会显示 <code class="docutils literal notranslate"><span class="pre">creating</span></code> ；
创建完后，归置组的 Acting Set 里的 OSD 们将建立互联；
一旦互联完成，归置组状态应该变为 <code class="docutils literal notranslate"><span class="pre">active+clean</span></code> ，
意思是 Ceph 客户端可以向归置组写入数据了。</p>
<p class="ditaa">
<img src="../../../_images/ditaa-569e998f9ca23415dc83d32b325b6007ba8cb07a.png"/>
</p>
</section>
<section id="id6">
<h3>互联建立中<a class="headerlink" href="#id6" title="Permalink to this heading"></a></h3>
<p>归置组建立互联时，会让存储数据副本的 OSD 们就这个 PG 内的数据和元数据状态<strong>达成一致</strong>。
互联完成，就意味着 OSD 们就那个 PG 的状态达成了一致。
然而，互联过程的完成并<strong>不能</strong>表明各副本都有了数据的最新版本。</p>
<aside class="topic">
<p class="topic-title">权威历史</p>
<p>Ceph <strong>不会</strong>向客户端确认写操作，
直到 acting set 里的所有 OSD 都完成了写操作。
这样处理保证了从上次成功互联起，
acting set 中至少有一个成员确认了每个写操作。</p>
<p>有了各个已确认写操作的精确记录，
Ceph 就可以构建和散布一个新的归置组权威历史——
一个完整、完全有序的操作集，如果被采用，
就能把一个 OSD 的归置组副本更新到最新。</p>
</aside>
</section>
<section id="id7">
<h3>活跃<a class="headerlink" href="#id7" title="Permalink to this heading"></a></h3>
<p>Ceph 完成互联后，一归置组状态会变为 <code class="docutils literal notranslate"><span class="pre">active</span></code> 。 <code class="docutils literal notranslate"><span class="pre">active</span></code> 状态意味着此 PG 内的数据通常是可用的，在主 OSD 和副本 OSD 上都可以做读出和写入操作。</p>
</section>
<section id="id8">
<h3>整洁<a class="headerlink" href="#id8" title="Permalink to this heading"></a></h3>
<p>当一个归置组处于 <code class="docutils literal notranslate"><span class="pre">clean</span></code> 状态时，存储着其数据和元数据的所有 OSD 们都已成功互联，并且没有孤立的副本。 Ceph 已把归置组中的所有对象复制了正确的份数。</p>
</section>
<section id="id9">
<h3>已降级<a class="headerlink" href="#id9" title="Permalink to this heading"></a></h3>
<p>当客户端向主 OSD 写入数据时，由主 OSD 负责把数据副本写入其余副本 OSD 。主 OSD 把对象写入存储器后，
在副本 OSD 创建完对象副本并向主 OSD 确认之前，
主 OSD 会一直停留在 <code class="docutils literal notranslate"><span class="pre">degraded</span></code> 状态。</p>
<p>归置组状态可以处于 <code class="docutils literal notranslate"><span class="pre">active+degraded</span></code> 状态，
原因在于一个 OSD 即使尚未持有所有对象也可以处于 <code class="docutils literal notranslate"><span class="pre">active</span></code> 状态。
如果一个 OSD 挂了， Ceph 会把分配到此 OSD 的归置组都标记为 <code class="docutils literal notranslate"><span class="pre">degraded</span></code> ；
那个 OSD 重生后，它们必须重新互联。然而，
客户端仍可以向处于 <code class="docutils literal notranslate"><span class="pre">degraded</span></code> 状态的归置组写入新对象，
只要它还在 <code class="docutils literal notranslate"><span class="pre">active</span></code> 状态。</p>
<p>如果一 OSD 挂了，且老是处于 <code class="docutils literal notranslate"><span class="pre">degraded</span></code> 状态， Ceph 会把
<code class="docutils literal notranslate"><span class="pre">down</span></code> 的 OSD 标记为在集群外（ <code class="docutils literal notranslate"><span class="pre">out</span></code> ）、并把那个 <code class="docutils literal notranslate"><span class="pre">down</span></code>
掉的 OSD 上的数据重映射到其它 OSD 。从标记为 <code class="docutils literal notranslate"><span class="pre">down</span></code> 到
<code class="docutils literal notranslate"><span class="pre">out</span></code> 的时间间隔由 <code class="docutils literal notranslate"><span class="pre">mon</span> <span class="pre">osd</span> <span class="pre">down</span> <span class="pre">out</span> <span class="pre">interval</span></code> 控制，
默认是 <code class="docutils literal notranslate"><span class="pre">600</span></code> 秒。</p>
<p>归置组也会被降级（ <code class="docutils literal notranslate"><span class="pre">degraded</span></code> ），因为 Ceph 找不到本应存在于此归置组中的一或多个对象，这时，你不能读写找不到的对象，但仍能访问位于降级归置组中的其它对象。</p>
</section>
<section id="id10">
<h3>恢复中<a class="headerlink" href="#id10" title="Permalink to this heading"></a></h3>
<p>Ceph 被设计为可容错，可抵御一定规模的软、硬件问题。
当某 OSD 挂了（ <code class="docutils literal notranslate"><span class="pre">down</span></code> ）时，
其内的归置组会落后于别的归置组副本；
此 OSD 重生（ <code class="docutils literal notranslate"><span class="pre">up</span></code> ）时，
归置组内容必须更新到当前状态；
在此期间， OSD 处于 <code class="docutils literal notranslate"><span class="pre">recovering</span></code> 状态。</p>
<p>恢复并非总是这些小事，因为一次硬件失败可能牵连多个 OSD 。
比如一个机柜或房间的网络交换机失败了，
这会导致多个主机上的 OSD 们集体落后于集群的当前状态。
在这种场景下，只能等故障解决后，
各个 OSD 才能开始恢复。</p>
<p>Ceph 提供了几个选项来均衡资源竞争，
如新服务请求、恢复数据对象和恢复归置组到当前状态。
<code class="docutils literal notranslate"><span class="pre">osd_recovery_delay_start</span></code> 选项允许一 OSD 在开始恢复进程前，
先重启、重建互联、甚至处理一些重放请求；
<code class="docutils literal notranslate"><span class="pre">osd_recovery_thread_timeout</span></code> 设置线程超时，
因为多个 OSD 可能交替失败、重启和重建互联；
<code class="docutils literal notranslate"><span class="pre">osd_recovery_max_active</span></code> 选项限制一个 OSD
最多同时处理多少个恢复请求，以防它压力过大而不能正常服务；
<code class="docutils literal notranslate"><span class="pre">osd</span> <span class="pre">recovery</span> <span class="pre">max</span> <span class="pre">chunk</span></code> 选项限制恢复数据块尺寸，
以防网络拥塞。</p>
</section>
<section id="id11">
<h3>回填中<a class="headerlink" href="#id11" title="Permalink to this heading"></a></h3>
<p>有新 OSD 加入集群时，
CRUSH 会把现有集群内的部分归置组重分配给它。
强制新 OSD 立即接受重分配的归置组会使之过载，
用归置组回填可使这个过程在后台开始。
只要回填顺利完成，新 OSD 就可以对外服务了。</p>
<p>在回填运转期间，你可能见到以下几种状态之一：
<code class="docutils literal notranslate"><span class="pre">backfill_wait</span></code> 表明一回填操作在等待时机，尚未开始；
<code class="docutils literal notranslate"><span class="pre">backfilling</span></code> 表明一回填操作正在进行；
<code class="docutils literal notranslate"><span class="pre">backfill_toofull</span></code> 表明需要进行回填，
但是因存储空间不足而不能完成。
某归置组不能回填时，其状态应该是 <code class="docutils literal notranslate"><span class="pre">incomplete</span></code> 。</p>
<p><code class="docutils literal notranslate"><span class="pre">backfill_toofull</span></code> 状态可能是暂时的，
PG 们可能挪走，空间就腾出来了。
<code class="docutils literal notranslate"><span class="pre">backfill_toofull</span></code> 和 <code class="docutils literal notranslate"><span class="pre">backfill_wait</span></code> 相似的地方在于，
随着环境的变化，回填可以继续进行。</p>
<p>Ceph 提供了几个选项，用于管理重分配归置组给一个 OSD
（特别是新 OSD ）时产生的爆发性负载。
<code class="docutils literal notranslate"><span class="pre">osd_max_backfills</span></code> 设置一个 OSD 双向的最大并发回填数
（默认为 1 。注意，使用 <a class="reference external" href="../../configuration/mclock-config-ref.rst">mClock</a> 调度器时不能更改此选项，
除非你设置了 <code class="docutils literal notranslate"><span class="pre">osd_mclock_override_recovery_settings</span> <span class="pre">=</span> <span class="pre">true</span></code> ，
参阅 <a class="reference external" href="../../configuration/mclock-config-ref.rst#recovery-backfill-options">mClock 回填</a>）。
<code class="docutils literal notranslate"><span class="pre">backfill_full_ratio</span></code> 可让一 OSD 在快到占满率（默认 90% ）时拒绝回填请求，
占满率可以用 <code class="docutils literal notranslate"><span class="pre">ceph</span> <span class="pre">osd</span> <span class="pre">set-backfillfull-ratio</span></code> 命令更改。
如果一个 OSD 拒绝了回填请求，
在间隔 <code class="docutils literal notranslate"><span class="pre">osd_backfill_retry_interval</span></code> 时间之后将重试
（默认 30 秒）； OSD 也能用 <code class="docutils literal notranslate"><span class="pre">osd_backfill_scan_min</span></code>
和 <code class="docutils literal notranslate"><span class="pre">osd_backfill_scan_max</span></code> 来管理扫描间隔
（默认分别是 64 和 512 ）。</p>
</section>
<section id="id12">
<h3>被重映射<a class="headerlink" href="#id12" title="Permalink to this heading"></a></h3>
<p>负责维护某一 PG 的 Acting Set 变更时，
数据要从旧的 Acting Set 迁移到新的 Acting Set 。
新的主 OSD 要花费一些时间才能提供服务，
所以老的主 OSD 还要持续提供服务、直到归置组迁移完。
数据迁移完后，运行图会包含新 Acting Set 里的主 OSD 。</p>
</section>
<section id="id13">
<h3>发蔫<a class="headerlink" href="#id13" title="Permalink to this heading"></a></h3>
<p>虽然 Ceph 用心跳来保证主机和守护进程在运行，
但是 <code class="docutils literal notranslate"><span class="pre">ceph-osd</span></code> 仍有可能进入 <code class="docutils literal notranslate"><span class="pre">stuck</span></code> 状态，
它们没有按时报告其状态（如网络瞬断）。
默认， OSD 守护进程每半秒（ <code class="docutils literal notranslate"><span class="pre">0.5</span></code> ）会一次报告其归置组、出流量、引导和失败统计状态，此频率高于心跳阀值。
如果一归置组的<strong>主 OSD</strong> 所在的 acting set 没能向监视器报告、
或者其它监视器已经报告了那个主 OSD 已 <code class="docutils literal notranslate"><span class="pre">down</span></code> ，
监视器们就会把此归置组标记为 <code class="docutils literal notranslate"><span class="pre">stale</span></code> 。</p>
<p>启动集群时，会经常看到 <code class="docutils literal notranslate"><span class="pre">stale</span></code> 状态，直到互联完成。
集群运行一阵后，如果还能看到有归置组位于 <code class="docutils literal notranslate"><span class="pre">stale</span></code> 状态，
就说明那些归置组的主 OSD 挂了（ <code class="docutils literal notranslate"><span class="pre">down</span></code> ）、
或没在向监视器报告统计信息。</p>
</section>
</section>
<section id="id14">
<h2>找出故障归置组<a class="headerlink" href="#id14" title="Permalink to this heading"></a></h2>
<p>如前所述，一个归置组状态不是 <code class="docutils literal notranslate"><span class="pre">active+clean</span></code> 时未必有问题。
一般来说，归置组卡住时 Ceph 的自修复功能往往无能为力，
卡住的状态细分为：</p>
<ul class="simple">
<li><p><strong>Unclean</strong>: 归置组里有些对象的副本数未达到期望次数，
它们应该在恢复中；</p></li>
<li><p><strong>Inactive</strong>: 归置组不能处理读写请求，因为它们在等着一个持有最新数据的 OSD 回到 <code class="docutils literal notranslate"><span class="pre">up</span></code> 状态；</p></li>
<li><p><strong>Stale</strong>: 归置组们处于一种未知状态，
因为存储它们的 OSD 有一阵子没向监视器报告了（由 <code class="docutils literal notranslate"><span class="pre">mon_osd_report_timeout</span></code> 配置）。</p></li>
</ul>
<p>为找出卡住的归置组，执行下列命令：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span class="prompt1">ceph<span class="w"> </span>pg<span class="w"> </span>dump_stuck<span class="w"> </span><span class="o">[</span>unclean<span class="p">|</span>inactive<span class="p">|</span>stale<span class="p">|</span>undersized<span class="p">|</span>degraded<span class="o">]</span></span>
</pre></div></div><p>详情见<a class="reference external" href="../control#placement-group-subsystem">归置组子系统</a>，
关于排除卡住的归置组见<a class="reference external" href="../../troubleshooting/troubleshooting-pg#troubleshooting-pg-errors">排除归置组错误</a>。</p>
</section>
<section id="id15">
<h2>定位对象<a class="headerlink" href="#id15" title="Permalink to this heading"></a></h2>
<p>要把对象数据存入 Ceph 对象存储，一 Ceph 客户端必须：</p>
<ol class="arabic simple">
<li><p>设置对象名</p></li>
<li><p>指定一<a class="reference external" href="../pools">存储池</a></p></li>
</ol>
<p>Ceph 客户端索取最新集群运行图、
并用 CRUSH 算法计算对象到<a class="reference external" href="../placement-groups">归置组</a>的映射，
然后计算如何动态地把归置组映射到 OSD 。
要定位对象，只需要知道对象名和存储池名字，例如：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span class="prompt1">ceph<span class="w"> </span>osd<span class="w"> </span>map<span class="w"> </span><span class="o">{</span>poolname<span class="o">}</span><span class="w"> </span><span class="o">{</span>object-name<span class="o">}</span><span class="w"> </span><span class="o">[</span>namespace<span class="o">]</span></span>
</pre></div></div><aside class="topic">
<p class="topic-title">练习：定位一个对象</p>
<p>反正是练习，我们先创建一个对象。给 <code class="docutils literal notranslate"><span class="pre">rados</span> <span class="pre">put</span></code> 命令指定一对象名、一个包含数据的测试文件路径、和一个存储池名字，例如：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span class="prompt1">rados<span class="w"> </span>put<span class="w"> </span><span class="o">{</span>object-name<span class="o">}</span><span class="w"> </span><span class="o">{</span>file-path<span class="o">}</span><span class="w"> </span>--pool<span class="o">=</span>data</span>
<span class="prompt1">rados<span class="w"> </span>put<span class="w"> </span>test-object-1<span class="w"> </span>testfile.txt<span class="w"> </span>--pool<span class="o">=</span>data</span>
</pre></div></div><p>用下列命令确认 Ceph 对象存储已经包含此对象：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span class="prompt1">rados<span class="w"> </span>-p<span class="w"> </span>data<span class="w"> </span>ls</span>
</pre></div></div><p>现在可以定位对象了：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span class="prompt1">ceph<span class="w"> </span>osd<span class="w"> </span>map<span class="w"> </span><span class="o">{</span>pool-name<span class="o">}</span><span class="w"> </span><span class="o">{</span>object-name<span class="o">}</span></span>
<span class="prompt1">ceph<span class="w"> </span>osd<span class="w"> </span>map<span class="w"> </span>data<span class="w"> </span>test-object-1</span>
</pre></div></div><p>Ceph 应该输出对象的位置，例如：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">osdmap</span> <span class="n">e537</span> <span class="n">pool</span> <span class="s1">&#39;data&#39;</span> <span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="nb">object</span> <span class="s1">&#39;test-object-1&#39;</span> <span class="o">-&gt;</span> <span class="n">pg</span> <span class="mf">1.</span><span class="n">d1743484</span> <span class="p">(</span><span class="mf">1.4</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">up</span> <span class="p">([</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">],</span> <span class="n">p0</span><span class="p">)</span> <span class="n">acting</span> <span class="p">([</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">],</span> <span class="n">p0</span><span class="p">)</span>
</pre></div>
</div>
<p>要删除测试对象，用 <code class="docutils literal notranslate"><span class="pre">rados</span> <span class="pre">rm</span></code> 即可，如：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span class="prompt1">rados<span class="w"> </span>rm<span class="w"> </span>test-object-1<span class="w"> </span>--pool<span class="o">=</span>data</span>
</pre></div></div></aside>
<p>随着集群的运转，对象位置会动态改变。
Ceph 动态重均衡的优点之一，就是把你从人工迁移中解救了，
详情见<a class="reference external" href="../../../architecture">体系结构</a>。</p>
</section>
</section>



<div id="support-the-ceph-foundation" class="admonition note">
  <p class="first admonition-title">Brought to you by the Ceph Foundation</p>
  <p class="last">The Ceph Documentation is a community resource funded and hosted by the non-profit <a href="https://ceph.io/en/foundation/">Ceph Foundation</a>. If you would like to support this and our other efforts, please consider <a href="https://ceph.io/en/foundation/join/">joining now</a>.</p>
</div>


           </div>
           
          </div>
          <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
        <a href="../monitoring/" class="btn btn-neutral float-left" title="监控集群" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
        <a href="../user-management/" class="btn btn-neutral float-right" title="用户管理" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
    </div>

  <hr/>

  <div role="contentinfo">
    <p>&#169; Copyright 2016, Ceph authors and contributors. Licensed under Creative Commons Attribution Share Alike 3.0 (CC-BY-SA-3.0).</p>
  </div>

   

</footer>
        </div>
      </div>

    </section>

  </div>
  

  <script type="text/javascript">
      jQuery(function () {
          SphinxRtdTheme.Navigation.enable(true);
      });
  </script>

  
  
    
   

</body>
</html>